package com.yuno.mock.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;

import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;

/**
 * Excel读取功能配置属性类
 * 
 * @author xrm
 * @since 2025-09-28
 */
@Data
@Component
@ConfigurationProperties(prefix = "excel.reader")
@Validated
public class ExcelReaderProperties {

    /**
     * 线程池配置
     */
    private ThreadPool threadPool = new ThreadPool();

    /**
     * 读取配置
     */
    private Reader reader = new Reader();

    /**
     * 分片配置
     */
    private Sharding sharding = new Sharding();

    /**
     * 线程池配置类
     */
    @Data
    public static class ThreadPool {
        
        /**
         * 核心线程数
         */
        @Min(1)
        @Max(50)
        @NotNull
        private Integer corePoolSize = 4;

        /**
         * 最大线程数
         */
        @Min(1)
        @Max(100)
        @NotNull
        private Integer maxPoolSize = 8;

        /**
         * 队列容量
         */
        @Min(10)
        @Max(1000)
        @NotNull
        private Integer queueCapacity = 100;

        /**
         * 线程空闲时间(秒)
         */
        @Min(30)
        @Max(300)
        @NotNull
        private Integer keepAliveSeconds = 60;

        /**
         * 线程名前缀
         */
        @NotNull
        private String threadNamePrefix = "excel-reader-";

        /**
         * 是否等待任务完成后关闭
         */
        @NotNull
        private Boolean waitForTasksToCompleteOnShutdown = true;

        /**
         * 等待终止超时时间(秒)
         */
        @Min(10)
        @Max(300)
        @NotNull
        private Integer awaitTerminationSeconds = 60;
    }

    /**
     * 读取配置类
     */
    @Data
    public static class Reader {
        
        /**
         * 最大文件大小(MB)
         */
        @Min(1)
        @Max(500)
        @NotNull
        private Integer maxFileSizeMb = 100;

        /**
         * 最大行数
         */
        @Min(1000)
        @Max(1000000)
        @NotNull
        private Integer maxRows = 100000;

        /**
         * 读取超时时间(秒)
         */
        @Min(30)
        @Max(1800)
        @NotNull
        private Integer timeoutSeconds = 300;

        /**
         * 是否跳过空行
         */
        @NotNull
        private Boolean skipEmptyRows = true;

        /**
         * 是否跳过空列
         */
        @NotNull
        private Boolean skipEmptyColumns = true;

        /**
         * 默认Sheet索引
         */
        @Min(0)
        @NotNull
        private Integer defaultSheetIndex = 0;
    }

    /**
     * 分片配置类
     */
    @Data
    public static class Sharding {
        
        /**
         * 分片策略: BY_SHEET, BY_ROWS, HYBRID
         */
        @NotNull
        private String strategy = "HYBRID";

        /**
         * 每个分片的最小行数
         */
        @Min(100)
        @Max(10000)
        @NotNull
        private Integer minRowsPerShard = 1000;

        /**
         * 每个分片的最大行数
         */
        @Min(1000)
        @Max(50000)
        @NotNull
        private Integer maxRowsPerShard = 10000;

        /**
         * 最大分片数
         */
        @Min(1)
        @Max(20)
        @NotNull
        private Integer maxShards = 10;

        /**
         * 是否启用负载均衡
         */
        @NotNull
        private Boolean enableLoadBalancing = true;
    }
}